/*
 * TacticaPepe.java
 *
 * Created on 17 de julio de 2006, 14:15
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.JReymosClub;

import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;

/**
 *
 * @author Administrador
 */
public class TacticaMario implements Tactica{
    
    final int J1 = 0;
    final int J2 = 1;
    final int J3 = 2;
    final int J4 = 3;
    final int J5 = 4;
    final int J6 = 5;
    final int J7 = 6;
    final int J8 = 7;
    final int J9 = 8;
    final int J10 = 9;
    final int J11 = 10;
    
    private int nValores[][]={
        {-152,0,6},  // Jugador 1[0]
        {-130,30,7},  // Jugador 2[1]
        {-90,0,5},  // Jugador 3[2]
        {-130,-30,7},  // Jugador 4[3]
        {-45,60,5},  // Jugador 5[4]
        {40,50,6},  // Jugador 6[5]
        {40,-50,6},  // Jugador 7[6]
        {-45,-60,5},  // Jugador 8[7]
        {105,70,7},  // Jugador 9[8]
        {70,0,5},  // Jugador 10[9]
        {105,-70,7}  // Jugador 11[10]
    };

    
    public Color getColor1() {
        return Color.WHITE;
    }

    public Color getColor2() {
        return new Color(222,222,255);
    }

    public Color getColorNumero() {
        return Color.black;
    }

    public String getNombre() {
        return "JReymos Club";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();

        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        
        //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
        Point bola=sj.getBola();
//        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));

        //Movimiento portero

        int y1=(int)(bola.getY());
        if (y1<-30) y1=-30;
        if (y1>30) y1=30;
        com.add(new ComandoIrA(J1, nValores[0][0], y1));
        
        //Movimiento J3
        com.add(new ComandoIrA(J3, nValores[J3][0], bola.getY()/2));       
        
        //Movimiento J2 y J4
        if (bola.getX() < 0) {
            com.add(new ComandoIrA(J2, nValores[J2][0], nValores[J2][1] + bola.getY()/4));  
            com.add(new ComandoIrA(J4, nValores[J4][0], nValores[J4][1] + bola.getY()/4));
        }
        
        //Movimiento J5 a J8
        for ( int n = J5; n <= J8; n++) {
            com.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] + bola.getY()/10));
        }
     


        //Para que los tiros al arco salgan cruzados
        int desvioTiro = 0;
        if ((int)(bola.getY()) >= 0)
            desvioTiro = -15; // Si esta en la zona izquierda patea hacia el poste derecho
        else
            desvioTiro = 15; // Si esta en la zona derecha patea hacia el poste izquierdo

        
        for (int n=0;n<11;n++){
            if (General.getDistancia(bola.getX(), bola.getY(), 160, 0) > 150) {
                int nSigJug;
                switch (n) {
                    case J1: { // El arquero que se la pase al mas cercano excluyendo al 3
                            int defensa[] = {J3};
                            nSigJug = sj.getInfoMasCercano(jugadores, jugadores[n].getLocation(), defensa, true)[0];
                        }
                        break;
                    case J4:{ //El 4 que se la de al mas cercano: 7 u 8
                            if (masCercanoDeDos(jugadores[n].getX(), jugadores[n].getY(), jugadores[J8].getX(), jugadores[J8].getY(), jugadores[J7].getX(), jugadores[J7].getY()) == 1)
                                nSigJug = J8;
                            else
                                nSigJug = J7;
                        }
                        break;
                    case J2: { //El 2 que se la de al mas cercano: 5 o 6
                            if (masCercanoDeDos(jugadores[n].getX(), jugadores[n].getY(), jugadores[J6].getX(), jugadores[J6].getY(), jugadores[J5].getX(), jugadores[J5].getY()) == 1)
                                nSigJug = J6;
                            else
                                nSigJug = J5;
                        }
                        break;
                    case J3: 
                    case J6: 
                    case J7: { // 3, 6 y 7 la pasan al mas cercano pero para adelante
                            nSigJug = sj.getInfoMasCercano(jugadores, jugadores[n].getLocation(), null, true)[0];
                        }
                        break;
                    case J5: 
                    case J8: 
                    case J9:
                    case J10:
                    case J11:
                    default: nSigJug=sj.getSiguienteJugador(n); break;
                }
                
                com.add(new ComandoPase(n, nSigJug));
            } else {
                switch(n) {
                    case J10: { 
                            if (jugadores[n].getX() < 100) {
                                int nSigJug = sj.getSiguienteJugador(n);
                                com.add(new ComandoPase(n, nSigJug));
                            }
                        }
                        break;
                    case J6:
                    case J7: { // Si los jugadores 6 o 7 estan cerca del arco pero no tanto que la pasen para adelante
                            if (jugadores[n].getX() < 100) {
                                int nSigJug = sj.getInfoMasCercano(jugadores, jugadores[n].getLocation(), null, true)[0];
                                com.add(new ComandoPase(n, nSigJug));
                            }                        
                        }
                        break;
                    default: com.add(new ComandoTiroAPuerta(n, desvioTiro)); break;
                    
                }    
                
                
            }
            
        }
        //Movimiento mas cercano a la bola

        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        return com;
        
        

        
    }
    
        private int masCercanoDeDos(double jugBaseX, double jugBaseY, double jug1X, double jug1Y, double jug2X, double jug2Y) {
            if (General.getDistancia(jugBaseX, jugBaseY, jug1X, jug1Y) < General.getDistancia(jugBaseX, jugBaseY,jug2X, jug2Y))
               return 1;
            else
               return 0;
        }    
    
}
